Skip to content

fix(shell): candidate-tui 缺少 Vim 时快速失败(本地诊断) - #267

Closed
JavaZeroo wants to merge 2 commits into
mainfrom
fix/candidate-tui-vim-precondition
Closed

JavaZeroo wants to merge 2 commits into
mainfrom
fix/candidate-tui-vim-precondition

Conversation

@JavaZeroo

@JavaZeroo JavaZeroo commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

问题与最终行为

candidate-tui 场景会在真实 shell 里键入 Vim 命令(experiments/shell/shell.cpp:723),而仓库文档要求 Vim 必须在 PATH 上(docs/research/joint-conpty-baseline.md:35)。当本机没有 Vim 时,这一步不是给出可读的失败,而是跑满 33 秒场景超时,唯一的痕迹是 shell 回显的 'vim' is not recognized as an internal or external command。

本 PR 在 experiments/shell/run.py 的 execute() 入口加一次前置检查:candidate-tui 启动前调用 shutil.which("vim"),缺失立即抛 RuntimeError 并指向文档。

按 docs/research/more-capture-ech.md「可选依赖缺失导致的 skip 不代替运行证据」,这里失败而不是 skip。

修正说明

本 PR 最初还包含一个 workflow 步骤(把 Git 自带的 usr/bin 加进 GITHUB_PATH)。该步骤已移除:#269 的 CI 结果显示,不含该步骤时两个 Windows alacritty 作业仍以 5m50s / 6m05s 通过——hosted runner 上 Vim 本来就在 PATH,CI 的真正失败是 route_terminal_events 对 kind 8/9/10/11/13 抛异常(由 #269 修复)。

保留前置检查的原因与 CI 无关:它只改善本机没有 Vim 时的诊断。

验证

  • 本机无 Vim,调用 require_fixed_vim('candidate-tui') 在 0.17 秒抛出带文档指引的 RuntimeError;原先同一场景要跑满 33 秒超时
  • 非 candidate-tui 模式不受影响
  • 不再改动任何 workflow 文件

性能影响(如适用)

不适用。新增一次 PATH 查找。

来源与限制

  • 本机复现与 CI 逐步结论见 #38 的证据评论
  • 限制:本 PR 不改变 candidate-tui 的断言,也不解决 CI 失败——后者由 #269 承担

alacritty-headless (windows-2025) 反复在「Build and test candidate shell on Windows」
失败。用 job API 取每步结论可定位到该步(无需日志),本地按同配置复现后原因明确:

  'vim' is not recognized as an internal or external command
  shell scenario timeout — Ran 6 tests in 33.099s

candidate-tui 场景会在真实 shell 里键入 vim 命令(shell.cpp:723),而
docs/research/joint-conpty-baseline.md:35 要求「需在 PATH 中显式提供固定 Vim」。
Git for Windows 的 vim.exe 位于 usr/bin,不在 hosted runner 默认 PATH,于是缺失
表现为 33 秒场景超时,而不是一条可读的失败原因。

两处修复:
- run.py: candidate-tui 启动前检查 shutil.which('vim'),缺失立即 RuntimeError;
  按 more-capture-ech.md「skip 不代替运行证据」,这里是失败而非 skip
- core-candidate.yml: Windows 上把 Git 自带的 usr/bin 加入 GITHUB_PATH,
  找不到则显式失败,保证该作业真的能跑 Vim 场景
@JavaZeroo JavaZeroo changed the title fix(ci): candidate-tui 缺 Vim 时快速失败,并在作业中提供固定 Vim fix(shell): candidate-tui 缺少 Vim 时快速失败(本地诊断) Oct 31, 2026
#269 的 CI 结果是决定性的:该 PR 不含本步骤,两个 alacritty Windows 作业仍然
5m50s / 6m05s 通过。也就是说 hosted runner 上 Vim 本来就在 PATH,真正的失败
一直是 route_terminal_events 对 kind 8/9/10/11/13 抛异常,而不是缺 Vim。

本步骤因此没有依据,还引入一个新失败面(Git 安装位置变化时 exit 1)。
保留 run.py 的前置检查:它只在本地没有 Vim 时把 33 秒场景超时换成一条带文档
指引的即时失败,对 CI 无副作用。
@JavaZeroo

Copy link
Copy Markdown
Owner Author

修正:本 PR 的前提判断是错的,workflow 部分已移除

上一轮我把这个失败归因为「CI 缺 Vim」,并加了两处改动。#269 的 CI 结果否定了这个前提:

PR 是否含 Vim PATH 步骤 alacritty Windows 结果
#269 否 5m50s / 6m05s 均通过
本 PR 是 一过(6m24s)一败(3m48s)
本 PR + 事件修复 — 才是完整解

也就是说 hosted runner 上 Vim 本来就在 PATH,CI 真正的失败一直是 shell.cpp:826 的
unsupported terminal event kind(候选适配器会发 13 种事件,shell 只处理 7 种),由 #269 修复。

因此:

  • 已移除 workflow 的 Vim PATH 步骤——它没有依据,还新增了一个失败面(Git 安装位置变化时 exit 1)
  • 保留 run.py 的前置检查:它只在本机没有 Vim 时把 33 秒场景超时换成带文档指引的即时失败,对 CI 无副作用

我的本地复现之所以指向 Vim,是因为这台机器确实没有 Vim;用它去推断 CI 环境是过度外推。教训记在这里,避免后来者沿用同一错误前提。

CI 失败的正确修复顺序:先 #269(事件分派),本 PR 只是本地诊断改善。

JavaZeroo added a commit that referenced this pull request Oct 31, 2026
并入 #267 的可用部分:candidate-tui 会在真实 shell 里键入 Vim 命令,缺少 Vim 时
不应跑满 33 秒场景超时,而应立即给出带文档指引的失败。

按 more-capture-ech.md「可选依赖缺失导致的 skip 不代替运行证据」,这里是失败
而不是 skip。与事件分派修复同属 candidate-tui 场景的健壮性,故并入本 PR;#267
的 workflow 部分已被证伪并移除。
@JavaZeroo

Copy link
Copy Markdown
Owner Author

并入 #269(事件分派修复 + Vim 快速失败)后关闭:本 PR 剩下的唯一内容已提交到 #269 分支,两者合在一起才能让 candidate_shell_tui 作业真正变绿。

@JavaZeroo JavaZeroo closed this Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant